\chapter{Estudi de la situació actual}
\section{Protocols i programaris existents}
Els protocols de seguretat poden proveir part o la totalitat dels serveis de seguretat aquí esmentats:
\begin{itemize}
\item \textbf{Xifrar el tràfic} de manera que no pugi ser llegit per ningú més que pels destinataris originals.
\item \textbf{Validar la integritat} per assegurar que el tràfic no ha estat modificat durant el seu recorregut.
\item \textbf{Autenticar els extrems} per assegurar que el tràfic prové d'un extrem de confiança.
\item \textbf{Evitar el repudi} de l'altre extrem per tal de que no pugui negar haver enviat la informació.
\item \textbf{Evitar la repetició} malintencionada de paquets (l'anti-repetició).
\end{itemize}

A continuació s'analitzaran alguns protocols i programaris existents que permeten la creació de VPNs.
\subsection{IPsec}
\keyword{IPsec}{Internet Protocol security} és d'ús opcional en IPv4 i serà obligatori en IPv6. IPsec va ser creat per proporcionar seguretat en dos possibles modes. El mode de transport (extrem a extrem), en el que els ordenadors dels extrems finals realitzen el processat de seguretat del tràfic de paquets; i el mode túnel (porta a porta) en el que la seguretat del tràfic de paquets és proporcionada a vàries màquines (inclús a tota la LAN) per un únic node.

IPsec va ser introduït per proporcionar serveis de seguretat tals com: xifrar el tràfic, validar la integritat, autenticar als extrems i l'anti-repetició. L'ús principal d'IPsec és el de crear VPNs en qualsevol dels dos modes, però les implicacions de seguretat són bastant diferents entre els dos modes d'operació.

La majoria d'implementacions d'aquest protocol tenen problemes de compatibilitat amb les altres implementacions del mateix protocol, degut a que cada fabricant interpreta els \rfckeyword{}s i s'adapta el protocol a la seva mida.

L'intercanvi de claus a escala Internet és va desenvolupar més tard i utilitza la infraestructura de clau pública universal \keyword{DNSSEC}{Domain Name System Security Extensions}, però la utilització d'aquesta tecnologia no es troba en gaires implementacions d'IPsec.

Així doncs depenent del nivell en el que actuï l'IPsec, aquest estarà treballant en mode transport o mode túnel.
\subsubsection{Mode transport}
En mode transport, només es xifra i/o autentica el \emph{payload} (la carga útil) del paquet IP. Per tant al no tocar les capçaleres IP no afecta a l'enrutament (o encaminament), però si s'utilitza l'\keyword{AH}{Authentication Header (per més informació consultar l'annex \refannexdesc{})} les direccions IP no poden ser traduïdes (com fa per exemple un NAT) ja que això faria que el valor del \emph{hash} (resum) no coincidís. Aquest mode s'utilitza en comunicacions ordinador a ordinador.

Per tal de travessar els NATs existeix un mecanisme d'encapsulació de missatges IPsec anomanat \keyword{NAT-T}{NAT Traversal in the IKE} en un RFC (veure \cite{rfc3715} i \cite{rfc3947}).
\subsubsection{Mode túnel}
En el mode túnel, es xifra i/o autentica tot el paquet IP sencer (capçalera inclusiva). Aquesta informació s'encapsula dins del \emph{payload} d'un nou paquet IP per tal de que pugui ser enrutat. Aquest mode s'utilitza en comunicacions xarxa a xarxa, per exemple per crear VPNs a través d'Internet.

\subsection{OpenVPN}
OpenVPN és un programa de VPN a nivell d'aplicació molt configurable. Per explicar les seves possibilitats s'explicaran els tres grups de configuració principals.
\begin{itemize}
\item \textbf{Modes de la VPN}:
Especifica el contingut que ha de circular dins de la VPN.
\item \textbf{Topologies internes}:
Especifica com veuen els sistemes operatius la interfície de la VPN.
\item \textbf{Modes de funcionament}:
Especifica el comportament de la aplicació.
\end{itemize}

Mijançant el \emph{driver} genèric i multiplataforma TUN/TAP l'aplicació pot crear dos modes de VPN:
\begin{itemize}
\item \textbf{Mode pont Ethernet}:
Simula una interfície de xarxa Ethernet i crea una VPN que treballa amb trames de capa 2 del \keywords{OSI}{model OSI}{Open Systems Interconnection - Basic Reference Model}.
\item \textbf{Mode túnel IP}:
Simula una interfície de xarxa punt-a-punt i crea una VPN que treballa amb paquets de capa 3 del model OSI.
\end{itemize}

OpenVPN en mode pont Ethernet sempre utilitza una única interfície de xarxa en cada màquina per tota la VPN. Peró en el mode túnel IP pot treballar \cite{openvpn-man} en diferents topologies internes:
\begin{itemize}
\item \textbf{p2p} (point-to-point): Utilitza una interfície de xarxa punt-a-punt al servidor per a cada client connectat, i el sistema operatiu del servidor s'encarrega de l'enrutat. Els clients només veuen el servidor i han d'utilitzar-lo com a \emph{router} per accedir a la resta de clients de la VPN. Aquest mode no és compatible amb les màquines que utilitzin Microsoft Windows.
\item \textbf{net30}: Utilitza una interfície de xarxa al servidor per a cada client connectat. Tant els clients com el servidor en les seves interfícies, utilitzen subxarxes /30 i per tant el sistema operatiu del servidor també s'encarrega de l'enrutat. Els clients segueixen veient només al servidor i han d'utilitzar-lo com a \emph{router} per accedir a la resta de clients de la VPN. Aquest mode és compatible amb les màquines que utilitzin Microsoft Windows.
\item \textbf{subnet}: Utilitza una única interfície de xarxa en cada màquina per tota la VPN, com en el mode Ethernet. Per tant, és l'aplicació qui s'encarrega de l'enrutat de la VPN. Aquest mode també és compatible amb les màquines que utilitzin Microsoft Windows.
\end{itemize}

L'aplicació independentment de la configuració anterior té diferents modes de funcionament:
\begin{itemize}
\item \textbf{Mode punt-a-punt}: Crea una VPN amb només 2 extrems.
\item \textbf{Mode servidor}: Permet que se li connectin varis clients.
\item \textbf{Mode client}: Permet connectar-se al servidor.
\end{itemize}
\begin{figure}[htb]
\centering
\includegraphics[height=0.5\textwidth]{images/vpn-centralized}
\caption{Topologia d'una VPN centralitzada}
\label{F:vpn-centralized}
\end{figure}
Per tant podem dir que és tracta d'una aplicació pensada per VPNs centralitzades (en la figura \ref{F:vpn-centralized} es mostra un diagrama d'aquesta topologia).

A nivell de seguretat utilitza la llibreria Open\keyword{SSL}{Secure Socket Layer (la versió 3 en convertir-se en estàndard es va anomenar TLS)} tant per \keyword{TCP}{Transmission Control Protocol} com per \keyword{UDP}{User Datagram Protocol}: en TCP utilitza l'estàndard \keyword{TLS}{Transport Layer Security (per més informació consultar l'annex \refannexdesc{})} i en UDP utilitza un protocol propi basat en TLS. Permet l'autenticació per claus secretes compartides prèviament, per certificats x509 i per usuari-contrasenya.

\subsection{TincVPN}
TincVPN és un programa de VPNs a nivell d'aplicació, que fa ús del \emph{driver} genèric i multiplataforma TUN/TAP. Mitjançant aquest \emph{driver} l'aplicació pot crear VPNs en \textbf{mode pont Ethernet} o en \textbf{mode túnel IP}, ja explicats anteriorment. L'aplicació crea una VPN mallada (figura \ref{F:vpn-meshed}) connectant-se a una llista de \emph{peers} (nodes client i servidor), i la resta de \emph{peers} de la VPN hauran de ser enrutats a través d'altres \emph{peers} per arribar als nodes que no tinguin connexió directe (veure \cite{tinc-doc}).
\begin{figure}[htb]
\centering
\includegraphics[height=0.5\textwidth]{images/vpn-meshed}
\caption{Topologia d'una VPN mallada}
\label{F:vpn-meshed}
\end{figure}

Utilitza una única interfície de xarxa en cada màquina per tota la VPN, com en la topologia interna \emph{subnet} de OpenVPN. Per tant, és cada \emph{peer} de la VPN qui s'encarrega a nivell d'aplicació del \emph{bridging} (adreçar les trames Ethernet al destí correcte) en mode pont Ethernet o del \emph{routing} (enrutament: adreçar els paquets IP cap al camí correcte) en mode túnel IP.

\label{TincVPN-Sec}
A nivell de seguretat utilitza un protocol propi tant en TCP com en UDP. Pot treballar només amb TCP, o utilitzar el TCP només com a canal de control i el UDP per les dades. Peter Gutmann va trobar nombroses errades de disseny en la seguretat del protocol de la versió 1 d'aquest programa que encara no s'han resolt (veure \cite{latm-metzdowd} i \cite{tinc-sec}: a l'annex \refannexmail{} es troba l'e-mail on exposa el seu anàlisi).

\subsection{Wippien}
Wippien és un programa de missatgeria instantània amb funcionalitats de creació de VPNs a nivell d'aplicació. Utilitza \keyword{XMPP}{Extensible Messaging and Presence Protocol} com a missatgeria instantània. Una vegada connectat al servidor XMPP, l'aplicació mostra a l'usuari la seva llista de contactes per tal que esculli amb quins contactes vol crear la VPN. Per crear-la negocia els paràmetres de la VPN (com la IP pública, el port i el protocol) a través d'XMPP. També utilitza HTTP cap a un servidor anomenat \emph{mediator}, que fa la funció de \keyword{DHCP}{Dynamic Host Configuration Protocol} assignant una IP única per sessió a cada \emph{peer} de la VPN; d'aquesta manera es garanteix que no hi hagi conflictes d'IPs.
Per tant podem dir que Wippien crea VPNs mallades i completament connectades per cada anella de confiança, amb autenticació (i assignació de les IPs) per part d'un servidor central extern (veure la figura \ref{F:vpn-externalized}).
\begin{figure}[htb]
\centering
\includegraphics[height=0.5\textwidth]{images/vpn-externalized}
\caption{Topologia d'una VPN amb autenticació externa}
\label{F:vpn-externalized}
\end{figure}

Utilitza una única interfície de xarxa en cada màquina per tota la VPN, com en la topologia interna \emph{subnet} de OpenVPN. Per tant, és cada \emph{peer} qui s'encarrega de l'enrutat de la VPN a nivell d'aplicació. Totes les IPs de les VPNs que utilitzin el seu servidor \emph{mediator} pertanyen a la xarxa 5.0.0.0/8 (veure \cite{wippien-web}).

A nivell de seguretat utilitza un protocol propi amb l'algoritme de xifratge AES128, mitjançant un component privatiu\footnote{component privatiu: part d'un programa privatiu (per més informació consultar el concepte \emph{proprietary software} a l'annex \refannexdesc{})} anomenat \emph{wodVPN ActiveX} \cite{wippien-comp}; aquest component és \emph{NAT friendly} (està preparat per travessar els routers NAT) i suporta tant TCP com UDP.

\subsection{Hamachi}
Hamachi és un programa privatiu de VPNs a nivell d'aplicació que suporta tant túnels IP com túnels \keyword{IPX}{Internetwork Packet Exchange}.
El programa utilitza una connexió a un servidor central com a canal de control (veure \cite{hamachi-web}). En arrancar efectua el procés d'autenticació amb aquest servidor i efectua el descobriment del canal del client per assegurar la connectivitat en cas d'existir routers NAT (per tant és una aplicació \emph{NAT friendly}). Finalment el servidor entrega al client la seva llista de VPNs juntament amb la llista dels membres connectats. Aquesta llista és actualitzada cada cop que aquests entren o surten de l'aplicació. Tal com s'ha dit el servidor ajuda: en el procés de superar els routers NAT, en el procés d'autenticació i en el descobriment de \emph{peers} (veure la figura \ref{F:vpn-externalized}).

Utilitza una única interfície de xarxa en cada màquina per tota la VPN. Per tant, és cada \emph{peer} qui s'encarrega de l'enrutat de la VPN a nivell d'aplicació. Totes les IPs de les VPNs pertanyen a la xarxa 5.0.0.0/8.

A nivell de seguretat la VPN utilitza un protocol propi sobre UDP.

\subsection{ELA VPN}
\keyword{ELA}{Everywhere Local Area network \cite{ela}} és un programa de VPN a nivell d'aplicació.
Utilitza una topologia de nodes mallada (veure la figura \ref{F:vpn-meshed}) connectada amb un protocol propi tant amb TCP com amb UDP.
D'aquesta tecnologia no s'ha trobat cap implementació, i el \emph{paper} descriptiu~\cite{ela} es troba adjunt a l'annex \refannexpapers.

\section{Comparativa}
Per acabar, la taula \ref{T:statecomp} fa un resum de les tecnologies analitzades en aquest capítol.
\begin{table}[htb]
\begin{center}
\begin{tabular}{|l|c|c|c|c|}
\hline
Nom & Lliure & Funcionament & Protocol & Seguretat \\ \hline \hline
\bf IPsec & Sí & Descentralitzat & IP & Estàndard \\ \hline
\bf OpenVPN & Sí & Centralitzat & TCP/UDP & TLS/Propi \\ \hline
\bf TincVPN & Sí & Mallat & TCP/UDP & Propi \\ \hline
\bf Wippien & No & Mallat amb Servidor & TCP/UDP & Propi \\ \hline
\bf Hamachi & No & Mallat amb Servidor & UDP & Propi \\ \hline
\bf ELA VPN & No & Mallat Jeràrquic & TCP/UDP & Propi \\ \hline
\end{tabular}
\end{center}
\begin{center}
\caption{Comparativa dels protocols i programaris existents}
\label{T:statecomp}
\end{center}
\end{table}

De les tecnologies de nivell d'aplicació disponibles esmentades, només TincVPN permet la creació de VPNs sense necessitar un servidor central. ELA VPN, tal com s'ha exposat, no està disponible i per tant també quedaria descartada. Tot i així, cap d'aquestes tecnologies permet la utilització d'adreçament autenticat que ha estat definit com a objectiu; per tant aquestes opcions es descarten per no complir la majoria d'objectius.
Per altre banda, IPsec permetria la majoria dels objectius, però degut a que la implementació necessita estar integrada al nucli dels sistemes operatius i que les diferents implementacions tenen problemes de compatibilitat entre elles, aquesta opció també es descarta.
